package org.apache.hadoop.hdfs.server.datanode.fsdataset.impl;

import com.google.common.collect.Maps;
import org.apache.hadoop.metrics2.annotation.Metric;
import org.apache.hadoop.metrics2.annotation.Metrics;
import org.apache.hadoop.metrics2.lib.MetricsRegistry;
import org.apache.hadoop.metrics2.lib.MutableRate;

import java.util.Map;

@Metrics(about = "FsVolume metrics", context = "dfs")
public class FsVolumeMetrics {
    static Map<String, FsVolumeMetrics> REGISTRY = Maps.newHashMap() ;

    String name;
    FsVolumeImpl volume;
    MetricsRegistry registry;

    @Metric
    MutableRate createTmpFileOp;
    @Metric
    MutableRate createRbwFileOp;
    @Metric
    MutableRate createTmpFileTimeout;
    @Metric
    MutableRate createRbwFileTimeout;

    // FsVolumnImpl，这个代表了一块磁盘
    // 一个datanode上面可能是对应了多块磁盘的，多个FsVolumnImpl
    // 是为每个FsVolumnImpl，为每一块磁盘都创建一个自定义的metrics监控类
    private FsVolumeMetrics(FsVolumeImpl volume) {
        this.name = "fsVolume:" + volume.getBasePath();
        this.registry = new MetricsRegistry(this.name);
        this.volume = volume;
    }

    /**
     * 注册磁盘的监控组件
     */
    public static FsVolumeMetrics register(FsVolumeImpl volume){
        FsVolumeMetrics metrics = new FsVolumeMetrics(volume);
        String name = metrics.getName();
        FsVolumeMetrics.REGISTRY.put(name,metrics);
        return metrics;
    }

    public String getName(){
        return this.name;
    }

    public void addCreateTmpFileOp(long time) {
        createTmpFileOp.add(time) ;  // datanode上有357次创建tmp文件的磁盘写操作
        // 每次都把磁盘写的耗时add都mutableRate里去
        // 最后可以看到一个折线图，tmp文件创建写磁盘耗时的变化趋势的折线图
    }

    public void addCreateTmpFileTimeout(long time) {
        createTmpFileTimeout.add(time);  // 可以看到一个折线图的，写磁盘耗时的折线图的变化趋势
    }

    public void addCreateRbwFileOp(long time) {
        createRbwFileOp.add(time);
    }

    public void addCreateRbwFileTimeout (long time) {
        createRbwFileTimeout.add(time);
    }
}
